<?php
// +-----------------------------------------------------------------------+
// |                                                                       |
// | WebFormsQA     (Question - Answer)                                    |
// | Copyright  (C) 2010                                                   |
// | Official site  www.scale-tech.ru                                      |
// | email          scale-tech@mail.ru                                     |
// | autor          Alexander Demachev                                     |
// |                                                                       |
// | This program is free software; you can redistribute it and/or modify  |
// | it under the terms of the GNU General Public License as published by  |
// | the Free Software Foundation; version 2 of the License.               |
// |                                                                       |
// | This program is distributed in the hope that it will be useful,       |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of        |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
// | GNU General Public License for more details.                          |
// +-----------------------------------------------------------------------+

/**
 * @file search_question.test.php
 * @brief файл содержит код для тестирования класса SearchQuestion \n
 * @include search_question.test.php
 */

/*! @addtogroup TestWebFormsQA Tестирование проекта WebFormsQA
 *  Группа включает классы для тестирования исходного кода
 *  @{
 */


/**
 * @class SearchQuestionTest
 * @brief Класс для проверки методов базового класса поиска \n
 *        Исходный код [ @ref search_question.test.php ] 
 */
class SearchQuestionTest extends PHPUnit_TestCase {


	/**
	 * поиск фразы в полях question и answer таблицы QUESTION_TABLE 
	 */
	function testSearchPhraseInQuestionAnswer()
	{
        $base       = &$GLOBALS["base"];
        $search     = new SearchQuestion($base);

        // очищаем базу
        DataAddTest::DeleteTestDataInDatabase();
        
        // добавление демонстрационных данных
    	//ExampleQuestionDatabase::addDemonstrationCategories($base);
    	// добавляю несколько вопросов, например "На каком языке программирования написан Trac"
    	ExampleQuestionDatabase::addCategoryTrac($base);
    	
    	// поиск только в названии вопроса
        $mode = 1;
        $out = array();
        // ищем строку
        $str_search = "На каком";
        $flag_order = false;
        
        $category = "Система Trac";
        $etalon = "На каком языке программирования написан Trac?";
        // ответ
        // Trac написан на языке программирования Python и в настоящее время распространяется 
		// по модифицированной лицензии BSD.</p>		
        
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( $category, $out[0][8] );
        $this->assertEquals( $etalon, $out[0][2] );
        $this->assertEquals( 1, sizeof($out) );
        
        // поиск в названии ответа
        $mode = 2;
        $out = array();
        $this->assertFalse( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 0, sizeof($out) );

		$str_search = "на языке программирования Python";
		$out = array();
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 1, sizeof($out) );
        

        // поиск и в названии вопроса и в содержании ответа
		$str_search = "каком языке";
        // $str_search = "лицензии BSD";
		$out = array();
		$mode = 3;
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 1, sizeof($out) );
        
        $str_search = "лицензии BSD";
		$out = array();
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 1, sizeof($out) );
        
        $str_search = "языке программирования";
		$out = array();
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 1, sizeof($out) );
        
        
		$str_search = "Какие базы данных поддерживает Trac?";
		// Ответ
		// Trac поддерживаются базы данных SQLite, PostgreSQL, MySQL и MariaDB</p>		
		
		$mode = 1;
		$out = array();
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 1, sizeof($out) );
        
        $str_search = "Trac";
		$mode = 1;
		$out = array();
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 2, sizeof($out) );

        $mode = 2;
		$out = array();
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 2, sizeof($out) );

        $mode = 3;
		$out = array();
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 2, sizeof($out) );

		$out = array();
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 2, sizeof($out) );

        // добавляю еще 3 вопроса в категории "Система Redmine"
		ExampleQuestionDatabase::addCategoryRedmine( $base );        

		$str_search = "Redmine";
		$mode = 3;
		$out = array();
		// $flag_order = true;
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 3, sizeof($out) );

        //**********************************************************
        //             Проверяю сортировку по категориям
        //**********************************************************        
		$str_search = "MySQL";
		$mode = 3;
		$out = array();
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 2, sizeof($out) );
        // пока без сортировки
        $cat1 = "Система Trac";
        $cat2 = "Система Redmine";
        $this->assertEquals( $cat1, $out[0][8] );
        $this->assertEquals( $cat2, $out[1][8] );
        
		$out = array();
        $flag_order = true;
        $this->assertTrue( $search->searchPhraseInQuestionAnswer($mode, $str_search, $out, $flag_order) );
        $this->assertEquals( 2, sizeof($out) );
        // c сортировкой по имени категории
        $this->assertEquals( $cat2, $out[0][8] ); 
        $this->assertEquals( $cat1, $out[1][8] );
        
	}
	
    // Метод проверяет наличие поиск заданной фразы
    function testSearchPhrase()
    {
        $base       = &$GLOBALS["base"];
        $search     = new SearchQuestion($base);

        // очищаем базу
        DataAddTest::DeleteTestDataInDatabase();

        $id_category    = 6;
        $question       = "Кто такие колобок и два жирафа";
        $email          = "alex@rambler.ru";

        $this->assertTrue($base->addQuestion($id_category, $question, $email, $id));

        $answer = "
            Колобок и два жирафа, это персонажи детской передачи,
            которая выходит на радио по воскресеньям в 11 часов утра.
        ";

        $this->assertTrue($base->addAnswer($id, $answer));

        // ищем строку
        $str_search = "колобок";

        $this->assertTrue($search->searchPhrase($str_search, $out));
        $this->assertEquals($id, $out[0][0]);
        $this->assertEquals(1, sizeof($out));


        $str_search = "колобок и три жирафа";
        $this->assertFalse($search->searchPhrase($str_search, $out));

        $question       = "Кто такие колобок и три жирафа";
        $this->assertTrue($base->addQuestion($id_category, $question, $email, $id2));

        $answer = "
            Колобок и три жирафа, это сектор МФЦИ. Угадайте кто колобок.
            контекстно зависимый вопрос.
        ";
        $this->assertTrue($base->addAnswer($id2, $answer));

        // ищем строку
        $str_search = "колобок";

        $this->assertTrue($search->searchPhrase($str_search, $out));
        $this->assertEquals($id2, $out[1][0]);
        $this->assertEquals(2, sizeof($out));

        $str_search = "колобок и три жир";

        $this->assertTrue($search->searchPhrase($str_search, $out));
        $this->assertEquals($id2, $out[0][0]);
        $this->assertEquals(1, sizeof($out));

        // поиск осуществляется без учета регистра
        $str_search = "КОНТЕКСТНО ЗАВИСИМЫЙ ВОПРОС";

        $this->assertTrue($search->searchPhrase($str_search, $out));
        $this->assertEquals($id2, $out[0][0]);
        $this->assertEquals(1, sizeof($out));

        $str_search = "hehehe где колобок";
        $this->assertFalse($search->searchPhrase($str_search, $out));

    } // testSearchPhrase

} // SearchQuestionTest

/*! @} */

?>
